# -*- coding: utf-8 -*-
import colorama
from colorama import Fore, Style
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['SimHei']
colorama.init(autoreset=True)

def get_user_input():
    while True:
        try:
            user_gender = input("请输入您的性别（'male'、'female'、'男'或'女'），或输入q或Q退出程序：")

            if user_gender.lower() == 'q':
                print("程序已退出。")
                return None  # 返回 None 表示退出程序

            if user_gender.lower() not in ['male', 'female', '男', '女']:
                raise ValueError(Fore.RED + "请输入提示项之一.")

            def calculate_BMR(gender, weight, height, age):
                gender = gender.lower()
                if gender in ['male', '男']:
                    BMR = 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age)
                else:
                    BMR = 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age)
                return BMR

            user_weight = get_positive_float_input("请输入您的体重（公斤，正数）：")
            user_height = get_positive_float_input("请输入您的身高（厘米，正数）：")
            user_age = get_positive_int_input("请输入您的年龄（正整数）：")

            user_BMR = calculate_BMR(user_gender, user_weight, user_height, user_age)
            standard_BMR = calculate_BMR('male', 70, 170, 25)  # 使用标准值进行对比

            display_results(user_BMR, standard_BMR)
        except ValueError as error:
            print(Fore.RED + "输入错误:", error, Fore.RED + "请重新输入！")
        except Exception as exception:
            print(Fore.RED + "发生异常:", exception, "请重新输入！" + Style.RESET_ALL)

def get_positive_float_input(prompt):
    while True:
        try:
            user_input = float(input(prompt))
            if user_input <= 0:
                raise ValueError(Fore.RED + "请输入正数.")
            return user_input
        except ValueError:
            print(Fore.RED + "输入内容不是数字或不是正数，请重新输入！")

def get_positive_int_input(prompt):
    while True:
        try:
            user_input = int(input(prompt))
            if user_input <= 0:
                raise ValueError(Fore.RED + "请输入正整数.")
            return user_input
        except ValueError:
            print(Fore.RED + "输入内容不是数字或不是正整数，请重新输入！")

def display_results(user_BMR, standard_BMR):
    print(Fore.GREEN + "您的基础代谢率（BMR）为:", user_BMR, "kcal")
    print(Fore.BLUE + "标准基础代谢率为:", standard_BMR, "kcal")

    # 生成对比柱状图
    labels = ['用户BMR', '标准BMR']
    values = [user_BMR, standard_BMR]

    plt.bar(labels, values, color=['green', 'blue'])
    plt.ylabel('BMR（kcal）')
    plt.title('用户BMR与标准BMR对比')
    plt.show()

# 主函数
if __name__ == "__main__":
    get_user_input()
